////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxtitan17xsettingsmanager.h
/// @brief Declarations for the Titan17xSettingsManager class.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXTITAN17XSETTINGSMANAGER_H
#define CAMXTITAN17XSETTINGSMANAGER_H

// Common CamX Includes
#include "camxincs.h"

// Core CamX Includes
#include "camxsettingsmanager.h"

// HWL CamX Includes
#include "g_camxtitan17xsettings.h"

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief SettingsManager class manages the set of default settings and override helpers.
///
/// More specifically:
///  1) Creates override helper objects (file, setprops)
///  2) Validates/overrides settings
///  3) Protects settings with Read/Write lock methods
///  4) Dumps current settings
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Titan17xSettingsManager final : public SettingsManager
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Public Methods
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  This function creates an instance of the Titan17xSettingsManager class.
    ///
    /// @return An instance of the Titan17xSettingsManager class
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static Titan17xSettingsManager* Create();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destroy
    ///
    /// @brief  This function destroys the instance of the Titan17xSettingsManager class.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID Destroy();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetTitan17xStaticSettings
    ///
    /// @brief  Returns a pointer to the static settings structure to directly access all settings values.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CAMX_INLINE const Titan17xStaticSettings* GetTitan17xStaticSettings() const
    {
        return &m_titan17xStaticSettings;
    }

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Protected Methods
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Titan17xSettingsManager
    ///
    /// @brief  The private constructor for the Titan17xSettingsManager object.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Titan17xSettingsManager() = default;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~Titan17xSettingsManager
    ///
    /// @brief  The private destructor for the Titan17xSettingsManager object.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~Titan17xSettingsManager();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwInitializeDefaultSettings
    ///
    /// @brief  Initializes all hardware-dependent, non-process-specific settings to default values. The implementation of this
    ///         method is auto-generated from the hardware-dependent settings XML file.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID HwInitializeDefaultSettings();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwInitializeDefaultDebugSettings
    ///
    /// @brief  Initializes the hardware-dependent, process-specific settings specified under "Debug Settings" to default
    ///         values. The implementation of this method is auto-generated from the hardware-dependent settings XML file.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID HwInitializeDefaultDebugSettings();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwLoadOverrideSettings
    ///
    /// @brief  Loads the hardware-dependent override settings from the specified store. The implementation of this method is
    ///         auto-generated from the hardware-dependent settings XML file.
    ///
    /// @param  pOverrideSettingsStore A pointer to the override settings store object from which to load override settings.
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult HwLoadOverrideSettings(
        IOverrideSettingsStore* pOverrideSettingsStore);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwLoadOverrideProperties
    ///
    /// @brief  Loads the hardware-dependent override settings from the specified store. The implementation of this method is
    ///         auto-generated from the hardware-dependent settings XML file.
    ///
    /// @param  pOverrideSettingsStore A pointer to the override settings store object from which to load override settings.
    /// @param  updateStatic           TRUE means update both dynamic and non-dynamic settings
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult HwLoadOverrideProperties(
        IOverrideSettingsStore* pOverrideSettingsStore,
        BOOL                    updateStatic);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwValidateSettings
    ///
    /// @brief  Validates the current values in the hardware-dependent settings structures.
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult HwValidateSettings();


#if SETTINGS_DUMP_ENABLE
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwDumpSettings
    ///
    /// @brief  This function prints all hardware-dependent settings names and values in the settings store.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID HwDumpSettings() const;
#endif // SETTINGS_DUMP_ENABLE

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Private Methods
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Initialize
    ///
    /// @brief  Initializes the Titan17x settings manager object.
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult Initialize();

    // Do not implement the copy constructor or assignment operator
    Titan17xSettingsManager(const Titan17xSettingsManager& rTitan17xSettingsManager) = delete;
    Titan17xSettingsManager& operator= (const Titan17xSettingsManager& rRHS) = delete;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Private Member Data
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// The static settings structure, including both hardware-independent and hardware-dependent settings.
    Titan17xStaticSettings m_titan17xStaticSettings;
};

CAMX_NAMESPACE_END

#endif // CAMXTITAN17XSETTINGSMANAGER_H
